package main

import (
	"encoding/json"

	"jlpay-sdk-go/pkg/jlpay/models/trans/refunds"
	"jlpay-sdk-go/pkg/jlpay/utils"
)

// 处理退款通知
func processRefundsNotify(notifyData map[string]interface{}) map[string]interface{} {
	utils.Info("开始处理退款通知")

	result := make(map[string]interface{})

	defer func() {
		if r := recover(); r != nil {
			utils.Errorf("处理退款通知时发生异常: %v", r)
			result["code"] = "99"
			result["message"] = "处理失败"
		}
	}()

	// 创建退款通知消息对象
	notifyMessage := refunds.NewRefundsNotifyMessageFromMap(notifyData)

	utils.Info("收到退款通知")
	utils.Infof("通知报文：%v", notifyMessage.ToMap())

	// 根据状态处理不同的业务逻辑
	switch notifyMessage.Status {
	case "1":
		utils.Info("退款状态：待确认")
		// 处理待确认状态
		// 可以更新本地订单状态为待确认
		break
	case "2":
		utils.Info("退款状态：成功")
		// 处理成功状态
		// 可以更新本地订单状态、发送成功通知等
		break
	case "3":
		utils.Info("退款状态：失败")
		// 处理失败状态
		// 可以记录失败原因、重试等
		break
	default:
		utils.Warnf("未知状态：%s", notifyMessage.Status)
	}

	// 返回成功响应
	result["code"] = "00"
	result["message"] = "处理成功"
	utils.Infof("处理结果：%v", result)
	return result
}

// 构建模拟的退款通知数据
func buildMockNotifyData() map[string]interface{} {
	return map[string]interface{}{
		"status":             "2", // 成功
		"summary":            "退款成功",
		"mch_id":             "849584358120018",
		"transaction_id":     "451147688260420350771289",
		"out_trade_no":       "REFUNDS_TEST_001",
		"chn_transaction_id": "CHN123456789",
		"ori_out_trade_no":   "TEST_ORDER_001",
		"ori_transaction_id": "80011557201909171853011568",
		"total_fee":          "100",
		"trans_time":         "20241230143000",
		"success_time":       "20241230143100",
	}
}

// 退款通知处理示例
func refundsNotifyDemo() {
	utils.Info("开始执行退款通知处理示例")

	// 构建模拟的通知数据
	mockNotifyData := buildMockNotifyData()

	// 处理退款通知
	result := processRefundsNotify(mockNotifyData)

	// 输出最终处理结果
	resultJSON, _ := json.MarshalIndent(result, "", "  ")
	utils.Infof("最终处理结果：%s", string(resultJSON))
	utils.Info("退款通知处理示例执行完毕")
}

func main() {
	// 设置日志级别为info，显示详细的调试信息
	utils.SetLogLevel("info")

	utils.Info("=============================")
	utils.Info("===== 退款通知处理示例 开始 =====")
	utils.Info("=============================")
	refundsNotifyDemo()

	utils.Info("\n=============================")
	utils.Info("===== 退款通知处理示例执行完毕 =====")
	utils.Info("=============================")
}
